using System;
using System.Threading;
using System.Runtime.CompilerServices;
using Microsoft.SPOT.Hardware;
using System.IO.Ports;

namespace Microsoft.SPOT.Hardware.HAG
{
    internal class HAGHardwareProvider : HardwareProvider
    {
        static HAGHardwareProvider()
        {
            Microsoft.SPOT.Hardware.HardwareProvider.Register(new HAGHardwareProvider());
        }

        override public void GetSerialPins(string comPort, out Cpu.Pin rxPin, out Cpu.Pin txPin, out Cpu.Pin ctsPin, out Cpu.Pin rtsPin)
        {
 
		switch (comPort)
            {
                case "COM1":
                    rxPin = Pins.GPIO_PORT_DEBUG_RX;
                    txPin = Pins.GPIO_PORT_DEBUG_TX;
                    ctsPin = Pins.GPIO_NONE;
                    rtsPin = Pins.GPIO_NONE;
                    break;
                case "COM2":
                    rxPin = Pins.GPIO_PORT_USART_RX0;
                    txPin = Pins.GPIO_PORT_USART_TX0;
                    ctsPin = Pins.GPIO_NONE;
                    rtsPin = Pins.GPIO_NONE;
                    break;
                case "COM3":
                    rxPin = Pins.GPIO_PORT_USART_RX1;
                    txPin = Pins.GPIO_PORT_USART_TX1;
                    ctsPin = Pins.GPIO_NONE;
                    rtsPin = Pins.GPIO_NONE;
                    break;
                case "COM4":
                case "COM5":
                case "COM6":
                case "COM7":
                    rxPin = Pins.GPIO_NONE;
                    txPin = Pins.GPIO_NONE;
                    ctsPin = Pins.GPIO_NONE;
                    rtsPin = Pins.GPIO_NONE;
                    break;
                default:
                    throw new NotSupportedException();                    
            }
        }

        override public void GetI2CPins( out Cpu.Pin scl, out Cpu.Pin sda )
        {
            scl = Pins.GPIO_PORT_I2C_SCL;
            sda = Pins.GPIO_PORT_I2C_SDA;
        }

        override public void GetSpiPins( SPI.SPI_module spi_mod, out Cpu.Pin msk, out Cpu.Pin miso, out Cpu.Pin mosi )
        {
            switch (spi_mod)
            {
                case SPI.SPI_module.SPI1:
                    msk  = Pins.GPIO_PORT_SPI1_MSK;
                    miso = Pins.GPIO_PORT_SPI1_OSI;
                    mosi = Pins.GPIO_PORT_SPI1_ISO;
                    break;
                case SPI.SPI_module.SPI2:
                    msk  = Pins.GPIO_PORT_SPI2_MSK;
                    miso = Pins.GPIO_PORT_SPI2_OSI;
                    mosi = Pins.GPIO_PORT_SPI2_ISO;
                    break;
                default:
                    throw new NotSupportedException();                    
            }
        }

        public override Microsoft.SPOT.Hardware.Cpu.Pin GetButtonPins(Microsoft.SPOT.Hardware.Button iButton)
        {
            switch (iButton)
            {
                case Microsoft.SPOT.Hardware.Button.VK_LEFT:
                    return Microsoft.SPOT.Hardware.HAG.Pins.GPIO_PORT_BUTTON_1;
                case Microsoft.SPOT.Hardware.Button.VK_RIGHT:
                    return Microsoft.SPOT.Hardware.HAG.Pins.GPIO_PORT_BUTTON_2;
                case Microsoft.SPOT.Hardware.Button.VK_UP:
                    return Microsoft.SPOT.Hardware.HAG.Pins.GPIO_PORT_BUTTON_0;
                case Microsoft.SPOT.Hardware.Button.VK_DOWN:
                    return Microsoft.SPOT.Hardware.HAG.Pins.GPIO_PORT_BUTTON_3;
                default:
                    return Microsoft.SPOT.Hardware.HAG.Pins.GPIO_NONE;
            }
        }
 
    }
}
